In computing, it is often useful to think of virtualization (defined broadly in this application to include paravirtualization) as falling into two major categories: platform or machine virtualization and resource virtualization. Typically, platform virtualization involves the creation of a virtual machine through the use of a software abstraction layer which separates an operating system from its hardware resources in terms of processing (e.g., CPU), memory, and I/O (e.g., storage, BIOS, etc.). In some implementations, the abstraction layer extends to network I/O, e.g., through the use of software abstractions such as virtual network interface cards (vNICs) and virtual switches. It will be appreciated that the virtual machine in platform virtualization is a hardware or system virtual machine as opposed to a process or application virtual machine such as the Java Virtual Machine. Examples of platform virtualization include the VMware ESX™ and Citrix XenServer™ hypervisors, both of which enable virtualization for platforms based on the x86 and x86-64 architectures (e.g., platforms in which the “guest” operating system might be non-Itanium Linux™ or Windows™). Informally, one might think of platform virtualization as creating a “virtualized environment” or as “making one machine work as many machines”
Resource virtualization involves the virtualization of specific system resources, such as storage volumes or network resources. Typically, resource virtualization does not involve the creation of virtual machines with guest operating systems. Examples of resource virtualization include Beowolf cluster virtualization and the Linux™ Virtual Server (LVS), which creates a load-balanced virtual server from a cluster of Linux™-based physical servers, without recourse to virtual machines with guest operating systems. Informally, one might think of resource virtualization as making “many machines look as one machine”.
It will be appreciated that load balancing is a technique to spread work among two or more computers, microprocessors, or other resources such as hard drives or network connections, in order to achieve a more optimal resource utilization, throughput, response time, uptime, etc. It is often used to spread work among a cluster of servers running the same application program, e.g., an Internet server program, database server program, or other application that tends to involve a large amount of I/O. Usually load-balancing functionality is provided by a dedicated program or hardware device. Examples of such hardware devices are the Citrix NetScaler™ and the F5 BIG-IP™, which operate at layers 4-7 of the of the Open Systems Interconnection Basic Reference (OSI) Model and are referred to as application switches. These hardware devices were not originally designed for virtualized platforms and are not optimized to perform with vNICs, virtual switches, etc. That is to say, these hardware devices are not “virtualization aware”. Further, they tend to be relatively expensive.
In particular implementations of the ESX™ hypervisor, virtual switches enable load balancing to spread the network traffic from one or more vNICs in an arrangement that is referred to as NIC teaming. See VMware™ Virtual Networking Concepts (VMware Inc., 2007), which is incorporated by reference herein. When NIC teaming is in place, one can use load balancing to choose a physical NIC for routing based on: (a) the originating virtual switch port ID; (b) a hash of the source MAC (Media Access Control) address; or (c) a hash of the source and destination IP (Internet Protocol) addresses. Load balancing in conjunction with NIC teaming makes use of and is constrained by a network packet's control information for layer 2 of the OSI Model, e.g., the data link layer.